安卓开发学习之HelloDaemon源码阅读 | 您所在的位置:网站首页 › dismissable 和disposable › 安卓开发学习之HelloDaemon源码阅读 |
背景
最近单位项目里要用到双服务进程保活,目的是要保证服务不被杀死。 双进程保活实际是两个进程相互监听,在各自的销毁回调方法里,启动对方。网上有一个不错的双服务进程保活开源框架,叫做HelloDaemon,github地址: https://github.com/xingda920813/HelloDaemon 现在,记录一下对于其的源码阅读过程 源码阅读 AbsWorkService我们的工作(服务)进程要继承于AbsWorkService,启动时要调用onBind()和onStartCommand()方法 @Override public int onStartCommand(Intent intent, int flags, int startId) { return onStart(intent, flags, startId); } @Nullable @Override public IBinder onBind(Intent intent) { onStart(intent, 0, 0); return onBind(intent, null); }其中onBind()里的onBind(intent, null)是留给子类实现的,用于bind时的业务逻辑。因此关键就是onStart()方法 onStart() /** * 1.防止重复启动,可以任意调用 DaemonEnv.startServiceMayBind(Class serviceClass); * 2.利用漏洞启动前台服务而不显示通知; * 3.在子线程中运行定时任务,处理了运行前检查和销毁时保存的问题; * 4.启动守护服务; * 5.守护 Service 组件的启用状态, 使其不被 MAT 等工具禁用. */ protected int onStart(Intent intent, int flags, int startId) { //启动守护服务,运行在:watch子进程中 DaemonEnv.startServiceMayBind(WatchDogService.class); //业务逻辑: 实际使用时,根据需求,将这里更改为自定义的条件,判定服务应当启动还是停止 (任务是否需要运行) Boolean shouldStopService = shouldStopService(intent, flags, startId); if (shouldStopService != null) { if (shouldStopService) stopService(intent, flags, startId); else startService(intent, flags, startId); } if (mFirstStarted) { mFirstStarted = false; //启动前台服务而不显示通知的漏洞已在 API Level 25 修复,大快人心! if (Build.VERSION.SDK_INT = Build.VERSION_CODES.JELLY_BEAN_MR2) DaemonEnv.startServiceSafely(new Intent(getApplication(), WorkNotificationService.class)); } getPackageManager().setComponentEnabledSetting(new ComponentName(getPackageName(), WatchDogService.class.getName()), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } return START_STICKY; }可分四步: 1、启动看门狗 2、停止或启动自身 3、初次调用时,启动前台服务并不显示通知 4、设置看门狗所在应用不被杀死 首先启动了一个WatchDogService,也就是看门狗服务,它就是用来每隔一段时间启动工作进程的。至于为何说DaemonEnv.startServiceMayBind()方法可以任意调用而不怕服务重复启动(实则时不怕服务重复绑定),可以点进去看看源码的实现 DaemonEnv#startServiceMayBind() public static void startServiceMayBind(@NonNull final Class |
CopyRight 2018-2019 实验室设备网 版权所有 |